import { Bullet } from "./Bullet";
import { AcGameObject } from "./AcGameObject";//基类
import { Cell } from "./Cell";
//注意：本代码，在所有渲染函数之外的地方，，所有宽高长的单位都是L（每一个小格子的长度）,不是像素，
//最后渲染时再*L，变成像素！
//渲染之前全是普通横纵(r,c)坐标，渲染时才变成canvas坐标
export class Enemy extends AcGameObject {//坦克的共同祖先

  constructor(r, c,kind,gamemap,store) {//在gamemap这张画布上的(r,c)位置画一个种类为kind的坦克
    super();
    
    this.cell=new Cell(r,c,0.8,0.8);//注意传入的参数

    this.store = store;

    this.kind = kind;//"ai"和"player_ai"

    this.gamemap=gamemap;
    this.direction = 2;
    

    this.image = new Image();//画图对象

    this.dr = [-1,0,1,0];//canvas坐标下的变化
    this.dc = [0,1,0,-1];

    this.speed = 3;//每秒移动五个格子
    this.status = "move"; //idle 表示静止 ； move 移动; die 死亡(敌机永远在移动，除非死亡)
    //这里状态虽然是"idle"但是下一帧就会变成"move"，这里只是因为要标识开始第一步

    this.coolingtime = 0;//记录帧数，每隔60帧(1s)，发射一枚子弹
    this.turntime = 0;//记录ai坦克改变方向的时间间隔

    this.bomb_zheng_count=30;//用于记录坦克爆炸效果的持续时间(暂定1s，60帧)；

  }

  
  set_status(status){
    this.status = status;
  }

  set_direction_auto(){//AI自己找方向，必须要在Enemy.js类内部实现（因为对于每一个敌机，都要单独设置并返回）

      if (this.status!=="die" && (this.turntime >=20 || this.status==="idle")) {//走完60帧或者撞障碍了，才能改变方向
        this.direction = parseInt(Math.random()*4);
        let next_cell = new Cell(this.cell.r+this.dr[this.direction]*this.speed * this.timedelta / 1000,
                            this.cell.c+this.dc[this.direction]*this.speed * this.timedelta / 1000,
                              0.8,0.8);

        if(this.gamemap.check_valid(next_cell,"ai")){
            this.set_status("move");
            this.turntime = 0;//方向选择成功了，才会重置转方向时间
            return true;
        }else{
            this.direction = parseInt(Math.random()*4);//不合法，就继续找
        }
    }
    return false;
  }



  update_move(){//更新每一帧的下一步坐标
    
    let next_cell = new Cell(this.cell.r+this.dr[this.direction]*this.speed * this.timedelta / 1000,
                            this.cell.c+this.dc[this.direction]*this.speed * this.timedelta / 1000,
                              0.8,0.8);

    if (!this.gamemap.check_valid(next_cell,"ai")) { //因为对于每个坦克都要判断，所以要写在Enemy.js内
      //这里如果判断下一步不合法，要变回静止状态
      this.status = "idle";//撞了就静止
    }else{
      this.cell = next_cell;
    }
  }

  attack(){
    if(this.status!=="die" && this.coolingtime>=30){//坦克还活着，且冷却时间超过60帧
          this.gamemap.bullets.push(new Bullet(this,this.gamemap,this.store));//发射子弹
          this.coolingtime=0;//重置冷却时间
    }
  }

  bomb_render(){//坦克死后，渲染爆炸效果
    let ctx = this.gamemap.ctx;
    let L = this.gamemap.L;
    this.image.src = require("../images/bomb/bomb.jpg");
    ctx.drawImage(
      this.image,
      this.cell.c*L,//（只对实际坐标画图）转成canvas像素x坐标
      this.cell.r*L,//转成canvas像素y坐标
      this.cell.width*L,
      this.cell.height*L
    );
  }


  start(){//只执行一次
  }
  update(){//每一帧执行一次 ，除了第一次

    if(this.turntime<200)this.turntime++;
    if(this.coolingtime<200)this.coolingtime++;

    //坦克一死，就有爆炸效果，同时bomb_zheng_count逐帧减小，减到0不再展示
    if(this.status==="die" && this.bomb_zheng_count>=0){//爆炸效果只展示30帧
      this.bomb_render();
      this.bomb_zheng_count--;
    }
    if(this.bomb_zheng_count<0)this.destroy();//死了，也爆炸结束了，赶紧销毁吧

    this.attack();
    this.set_direction_auto();//自动设置方向

    if(this.status==="move")this.update_move();

    if(this.status!=="die"){//子弹和身体，只有活的坦克才能拥有
        this.render();
    }
    
  }

  render() {//渲染函数，调用draw画出墙
    let ctx = this.gamemap.ctx;
    let L = this.gamemap.L;
    if(this.kind==="ai")
      switch (this.direction) {
        case 0:
          this.image.src = require("../images/tank/top.gif");//不知道为什么，这里必须要加require!!我在这卡了一天！！
          break;
        case 1:
          this.image.src = require("../images/tank/right.gif");
          break;
        case 2:
          this.image.src = require("../images/tank/bottom.gif");
          break;
        case 3:
          this.image.src = require("../images/tank/left.gif");
          break;
        default:
          this.image.src = require("../images/tank/bottom.gif");
      }
    else if(this.kind === "player_ai")
      switch (this.direction) {
        case 0:
          this.image.src = require("../images/playerai/top.gif");//不知道为什么，这里必须要加require!!我在这卡了一天！！
          break;
        case 1:
          this.image.src = require("../images/playerai/right.gif");
          break;
        case 2:
          this.image.src = require("../images/playerai/bottom.gif");
          break;
        case 3:
          this.image.src = require("../images/playerai/left.gif");
          break;
        default:
          this.image.src = require("../images/playerai/bottom.gif");
    }

      ctx.drawImage(
        this.image,
        this.cell.c*L,//（只对实际坐标画图）转成canvas像素x坐标
        this.cell.r*L,//转成canvas像素y坐标
        this.cell.width*L,
        this.cell.height*L
      );

  }

}